package com.lzw.security.aspect;

import com.lzw.security.entity.Parent;
import com.lzw.security.exception.MysqlUpdateException;
import com.lzw.security.exception.TidcNulException;
import com.lzw.security.ov.UserOV;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author ：冯涛滔
 * @date ：Created in 2020-3-29 10:42
 * @description：切面检查是否有成功更改数据库 https://blog.csdn.net/u012887385/article/details/54600706
 * @modified By：
 * 参数匹配模式：
 * ()匹配了一个不接受任何参数的方法，
 * (..)匹配了一个接受任意数量参数的方法（零或者更多）。
 * (*)匹配了一个接受一个任何类型的参数的方法。
 * (*,String)匹配了一个接受两个参数的方法，第一个可以是任意类型， 第二个则必须是String类型。
 * https://www.jianshu.com/p/ca9eb94e71f1
 * @version:
 */
@Slf4j
@Aspect//切面注解
@Component//构成
public class CheckUpdate {
//    @Before("login()") //在本类的login执行之前
    //在本类的login执行之后执行
//    @After("login()")
    //设置在ManagerController的login方法的切点
//    @Pointcut("execution(public * com.jieshao.evm.Controller.ManagerController.login(..))")
    //@Around是在函数运行的之前和之后，能决定是否运行函数
    //后置通知
    @AfterReturning(
            value =  "@annotation(com.lzw.security.entity.CheckUpdate)",
            returning = "userOV") //拿到方法的返回值
    public void checkUpdate(UserOV<Integer> userOV) throws MysqlUpdateException {
        if(userOV.getData()<1){
            log.debug("想修改数据");
            throw new MysqlUpdateException("修改数据失败");
        }
    }
    @Before("@annotation(com.lzw.security.entity.CheckId)")
    public void checkId(JoinPoint  joinPoint){
        Object[] args = joinPoint.getArgs();
        Parent parent = (Parent) args[0];
//        if (parent.id==null) {
//            throw new TidcNulException("参数不完整");
//        }
    }

}
